package cn.seaboot.admin.user.dao;

import cn.seaboot.admin.user.bean.User;
import org.springframework.stereotype.Repository;
import cn.seaboot.admin.mvc.argument.ModifyArgument;

import java.util.List;
import java.util.Map;

/**
 * User
 *
 * @author Mr.css
 */
@Repository
public interface UserDao {

    /**
     * 增
     *
     * @param user pojo
     * @return affected rows
     */
    int insert(User user);

    /**
     * 改 - 通用属性，无所谓的数据
     *
     * @param user pojo
     * @return affected rows
     */
    int updateSampleById(User user);

    /**
     * 快捷更新
     *
     * @param arg 字段信息
     * @return affected rows
     */
    int updateFieldById(ModifyArgument arg);

    /**
     * 改 - 密码，影响账户安全
     *
     * @param id   id
     * @param pwd  密码
     * @param salt 盐值
     * @return affected rows
     */
    int updatePassword(String id, String pwd, String salt);

    /**
     * 改 - 分组，影响鉴权
     *
     * @param id      id
     * @param deptId  部门 id
     * @return affected rows
     */
    int updateGroupId(String id, String deptId);

    /**
     * 改 - 冻结状态，影响鉴权
     *
     * @param account  帐号
     * @param disabled 是否可用
     * @return affected rows
     */
    int updateDisabled(String account, Boolean disabled);

    /**
     * 使用 ID 查询
     *
     * 业务上可能用得比较多
     *
     * @param id 帐号 ID
     * @return pojo
     */
    User selectById(String id);

    /**
     * 使用帐号查询
     *
     * 鉴权的时候通常用这个函数
     *
     * @param account 帐号
     * @return pojo
     */
    User selectByAccount(String account);

    /**
     * 使用帐号查询
     *
     * 包含一些敏感信息，注意 Service 层不要对外暴露这个函数
     *
     * @param account 帐号
     * @return pojo
     */
    User selectFullByAccount(String account);

    /**
     * 列表查询
     *
     * @param params 参数
     * @return list
     */
    List<User> selectList(Map<String, Object> params);

    // authority ------------------------------------------------------------------------------------------

    /**
     * 列表查询
     *
     * @param params 参数
     * @return list
     */
    List<User> selectFully(Map<String, Object> params);

    /**
     * 查询下属用户
     *
     * @param orgId 机构ID
     * @param path  分组编码
     * @return pojo
     */
    List<User> selectBelow(String orgId, String path);

    /**
     * 查询平级和下属用户
     *
     * @param orgId 机构ID
     * @param path  分组编码
     * @return pojo
     */
    List<User> selectHorizon(String orgId, String path);

    /**
     * 查询上级用户
     *
     * @param orgId 机构ID
     * @param path  分组编码
     * @return pojo
     */
    List<User> selectAbove(String orgId, String path);
}
